#ifndef NPDM_TESTER_H
#define NPDM_TESTER_H

#include "npdm_patterns.h"
#include "npdm_operators.h"
#include "npdm_sweep.h"

//===========================================================================================================================================================

class Npdm_tester {

  public:
    Npdm_tester(int order, int nsites, Npdm_sweep npdm_sweep);
    void test_if_fully_built( int order );

  private:
    int nsites_;
    int order_;
    Npdm_sweep npdm_sweep_;

    std::pair<long int, long int> test_if_2pdm_fully_built();
    std::pair<long int, long int> test_if_3pdm_fully_built();
    std::pair<long int, long int> test_if_4pdm_fully_built();

    long int get_2pdm_spin_degeneracy( std::vector<int> & indices );
    long int get_3pdm_spin_degeneracy( std::vector<int> & indices );

    bool valid_fermion_string( std::vector<int> & indices );

};

//===========================================================================================================================================================

#endif

